{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# pandas 进阶修炼 ｜早起Python\n",
    "<br>\n",
    "\n",
    "**本习题由公众号【早起Python & 可视化图鉴】 原创，转载及其他形式合作请与我们联系（微信号`sshs321`)，未经授权严禁搬运及二次创作，侵权必究！**\n",
    "\n",
    "\n",
    "\n",
    "本习题基于 `pandas` 版本 `1.1.3`，所有内容应当在 `Jupyter Notebook` 中执行以获得最佳效果。\n",
    "\n",
    "\n",
    "不同版本之间写法可能会有少许不同，如若碰到此情况，你应该学会如何自行检索解决。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7 - 数据透视与合并\n",
    "\n",
    "\n",
    "\n",
    "<br>\n",
    "\n",
    "**<font color = '#5172F0'><font size=3.5>必读👇👇👇**</font>\n",
    "    \n",
    "现在让我们继续练习 pandas数据分析另一组常用操作 --> **数据透视与合并**\n",
    "\n",
    "\n",
    "本节习题将涉及四大函数：\n",
    "    \n",
    "- pivot_table\n",
    "- concat\n",
    "- merge\n",
    "- join\n",
    "\n",
    "随着练习的深入，若没有一定的基础知识将很难继续刷题\n",
    "    \n",
    "官方文档永远是最好的学习手册，在本节之前强烈建议学习[官方文档对应部分](https://pandas.pydata.org/pandas-docs/version/0.20/merging.html#database-style-dataframe-joining-merging)\n",
    " \n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 初始化\n",
    "\n",
    "<br>\n",
    "\n",
    "该 `Notebook` 版本为**纯习题版**\n",
    "\n",
    "如果需要答案或者提示，可以微信搜索公众号「早起Python」获取！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据透视表\n",
    "\n",
    "![](http://liuzaoqi.oss-cn-beijing.aliyuncs.com/2021/09/14/16316101294678.jpg?域名/sample.jpg?x-oss-process=style/stylename)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1 - 加载数据\n",
    "\n",
    "读取当前目录下 `\"某超市销售数据.csv\"` 并设置千分位符号为 `,`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2 - 数据透视｜默认\n",
    "\n",
    "制作各省「平均销售额」的数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3 - 数据透视｜指定方法\n",
    "\n",
    "制作各省「销售总额」的数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4 - 数据透视｜多方法\n",
    "\n",
    "制作各省「销售总额」与「平均销售额」的数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5 - 数据透视｜多指标\n",
    "\n",
    "制作各省市「销售总额」与「利润总额」的数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6 - 数据透视｜多索引\n",
    "\n",
    "制作「各省市」与「不同类别」产品「销售总额」的数据透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7 - 数据透视｜多层\n",
    "\n",
    "制作各省市「不同类别」产品的「销售总额」透视表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8 - 数据透视｜综合\n",
    "\n",
    "制作「各省市」、「不同类别」产品「销售量与销售额」的「均值与总和」的数据透视表，并在最后追加一行『合计』"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 9 - 数据透视｜筛选\n",
    "\n",
    "在上一题的基础上，查询 **「类别」** 等于 **「办公用品」** 的详情"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 10 -数据透视｜逆透视"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "逆透视就是将宽的表转换为长的表，例如将第 5 题的透视表进行逆透视，其中不需要转换的列为『数量』列"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据合并"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### concat - 数据拼接"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`concat`主要用于**数据拼接**，也是非常常用的一个操作\n",
    "\n",
    "除了官方文档外很难找到比官方文档更好的练习\n",
    "\n",
    "以下案例来源或基于 [👉官方文档](https://pandas.pydata.org/pandas-docs/version/0.20/merging.html) 中的案例修改而来\n",
    "\n",
    "在练习之前应执行下方代码生成数据\n",
    "\n",
    "并应预览不同数据的结构以及每题的图解（如果有）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [],
   "source": [
    "df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],\n",
    "                    'B': ['B0', 'B1', 'B2', 'B3'],\n",
    "                    'C': ['C0', 'C1', 'C2', 'C3'],\n",
    "                    'D': ['D0', 'D1', 'D2', 'D3']},\n",
    "                   index=[0, 1, 2, 3])\n",
    "\n",
    "\n",
    "df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],\n",
    "                    'B': ['B4', 'B5', 'B6', 'B7'],\n",
    "                    'C': ['C4', 'C5', 'C6', 'C7'],\n",
    "                    'D': ['D4', 'D5', 'D6', 'D7']},\n",
    "                   index=[4, 5, 6, 7])\n",
    "\n",
    "\n",
    "df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],\n",
    "                    'B': ['B8', 'B9', 'B10', 'B11'],\n",
    "                    'C': ['C8', 'C9', 'C10', 'C11'],\n",
    "                    'D': ['D8', 'D9', 'D10', 'D11']},\n",
    "                   index=[8, 9, 10, 11])\n",
    "\n",
    "\n",
    "df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],\n",
    "                    'D': ['D2', 'D3', 'D6', 'D7'],\n",
    "                    'F': ['F2', 'F3', 'F6', 'F7']},\n",
    "                   index=[2, 3, 6, 7])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 11 - <font color = '#FB8E00'>concat</font>｜默认拼接\n",
    "\n",
    "拼接 df1 和 df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 12 - <font color = '#FB8E00'>concat</font>｜拼接多个\n",
    "\n",
    "垂直拼接 `df1、df2、df3`，效果如下图所示\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_basic.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 13 - <font color = '#FB8E00'>concat</font>｜重置索引\n",
    "\n",
    "垂直拼接 df1 和 df4，并按顺序重新生成索引，\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_ignore_index.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 14 - <font color = '#FB8E00'>concat</font>｜横向拼接\n",
    "\n",
    "横向拼接 `df1、df4`，效果如下图所示\n",
    "\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_axis1.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![公众号：早起Python](http://liuzaoqi.oss-cn-beijing.aliyuncs.com/2021/09/18/16319660121648.jpg?域名/sample.jpg?x-oss-process=style/stylename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 15 - <font color = '#FB8E00'>concat</font>｜横向拼接（取交集）\n",
    "\n",
    "在上一题的基础上，只取结果的交集\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_axis1_inner.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "微信搜索公众号「早起Python」，关注后可以获得更多资源！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 16 - <font color = '#FB8E00'>concat</font>｜横向拼接（取指定）\n",
    "\n",
    "在 14 题基础上，只取包含 df1 索引的部分\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_axis1_join_axes.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 17 - <font color = '#FB8E00'>concat</font>｜新增索引\n",
    "\n",
    "拼接 `df1、df2、df3`，同时新增一个索引（`x、y、z`）来区分不同的表数据来源\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_concat_keys.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### merge - 数据连接"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "concat是拼接，merge则是连接，同样重要的一个操作\n",
    "\n",
    "同样很难找到比官方文档更好的练习，以下案例来源或基于 [👉官方文档](https://pandas.pydata.org/pandas-docs/version/0.20/merging.html#database-style-dataframe-joining-merging) 中的案例修改而来\n",
    "\n",
    "在练习之前应执行每题下方的代码生成数据\n",
    "\n",
    "并应预览不同数据的结构以及每题的图解（如果有）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 18 - <font color = '#1B85FF' >merge</font>｜按单键\n",
    "\n",
    "根据 `key` 连接 `left` 和 `right`\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],\n",
    "                     'A': ['A0', 'A1', 'A2', 'A3'],\n",
    "                     'B': ['B0', 'B1', 'B2', 'B3']})\n",
    "\n",
    "right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],\n",
    "                      'C': ['C0', 'C1', 'C2', 'C3'],\n",
    "                      'D': ['D0', 'D1', 'D2', 'D3']})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 19 - <font color = '#1B85FF' >merge</font>｜按多键\n",
    "\n",
    "根据 `key1` 和 `key2` 连接 `left` 和 `right`\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key_multiple.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],\n",
    "                     'key2': ['K0', 'K1', 'K0', 'K1'],\n",
    "                     'A': ['A0', 'A1', 'A2', 'A3'],\n",
    "                     'B': ['B0', 'B1', 'B2', 'B3']})\n",
    "\n",
    "\n",
    "right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],\n",
    "                      'key2': ['K0', 'K0', 'K0', 'K0'],\n",
    "                      'C': ['C0', 'C1', 'C2', 'C3'],\n",
    "                      'D': ['D0', 'D1', 'D2', 'D3']})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 20 - <font color = '#1B85FF' >merge</font>｜左外连接\n",
    "\n",
    "\n",
    "如下图所示的结果连接 left 和 right，保留左表全部键\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key_left.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 21 - <font color = '#1B85FF' >merge</font>｜右外连接\n",
    "\n",
    "\n",
    "如下图所示的结果连接 left 和 right，保留右表全部键\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key_right.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 22 - <font color = '#1B85FF' >merge</font>｜全外连接\n",
    "\n",
    "\n",
    "如下图所示的结果连接 left 和 right，保留全部键\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key_outer.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 23 - <font color = '#1B85FF' >merge</font>｜内连接\n",
    "\n",
    "\n",
    "如下图所示的结果连接 left 和 right，保留交集\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_on_key_inner.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 24 - <font color = '#1B85FF' >merge</font>｜重复索引\n",
    "\n",
    "\n",
    "重新产生数据并按下图所示进行连接\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_merge_overlapped_suffix.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]})\n",
    "\n",
    "right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### join - 组合"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后一个数据合并的常用且重要的操作是`join`\n",
    "\n",
    "同样很难找到比官方文档更好的练习，以下案例来源或基于 [👉官方文档](https://pandas.pydata.org/pandas-docs/version/0.20/merging.html#database-style-dataframe-joining-merging) 中的案例修改而来\n",
    "\n",
    "在练习之前应执行每题下方的代码生成数据\n",
    "\n",
    "并应预览不同数据的结构以及每题的图解（如果有）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],\n",
    "                     'B': ['B0', 'B1', 'B2']},\n",
    "                     index=['K0', 'K1', 'K2'])\n",
    "\n",
    "\n",
    "right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],\n",
    "                      'D': ['D0', 'D2', 'D3']},\n",
    "                      index=['K0', 'K2', 'K3'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 25 -  <font color ='#27BE49'>join</font>｜左对齐\n",
    "\n",
    "合并 left 和 right，并按照 left 的索引进行对齐"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_join.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 26 - <font color ='#27BE49'>join</font>｜左对齐（外连接）\n",
    "\n",
    "按下图所示进行连接\n",
    "\n",
    "思考：merge 做法\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_join_outer.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 27 - <font color ='#27BE49'>join</font>｜左对齐（内连接）\n",
    "\n",
    "按下图所示进行连接\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_join_inner.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 28 - <font color ='#27BE49'>join</font>｜按索引\n",
    "\n",
    "重新产生数据并按下图所示进行连接（根据 `key`）\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_join_key_columns.png)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],\n",
    "                     'B': ['B0', 'B1', 'B2', 'B3'],\n",
    "                     'key': ['K0', 'K1', 'K0', 'K1']})\n",
    "\n",
    "\n",
    "right = pd.DataFrame({'C': ['C0', 'C1'],\n",
    "                      'D': ['D0', 'D1']},\n",
    "                      index=['K0', 'K1'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 29 - <font color ='#27BE49'>join</font>｜按索引（多个）\n",
    "\n",
    "重新产生数据并按下图所示进行连接（根据 `key1` 和 `key2`）\n",
    "\n",
    "![](https://pandas.pydata.org/pandas-docs/version/0.20/_images/merging_join_multikeys.png)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],\n",
    "                     'B': ['B0', 'B1', 'B2', 'B3'],\n",
    "                     'key1': ['K0', 'K0', 'K1', 'K2'],\n",
    "                     'key2': ['K0', 'K1', 'K0', 'K1']})\n",
    "\n",
    "\n",
    "index = pd.MultiIndex.from_tuples([('K0', 'K0'), ('K1', 'K0'),\n",
    "                                  ('K2', 'K0'), ('K2', 'K1')])\n",
    "\n",
    "\n",
    "right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],\n",
    "                   'D': ['D0', 'D1', 'D2', 'D3']},\n",
    "                  index=index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](http://liuzaoqi.oss-cn-beijing.aliyuncs.com/2021/09/16/16317972442543.jpg?域名/sample.jpg?x-oss-process=style/stylename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "384px"
   },
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
